// 配置路由器

//1.引入Vue
import Vue from "vue"

//2. 引入Vue-router
import VueRouter from "vue-router"

//3. 使用router
Vue.use(VueRouter)

//引入store
import store from "@/store"

// // 引入路由组件
// // import Home from "@/pages/Home"
// import Search from "@/pages/Search"
// import Login from "@/pages/Login"
// import Register from "@/pages/Register"
// import Detail from "@/pages/Detail"
// import AddCartSuccess from "@/pages/AddCartSuccess"
// import ShopCart from "@/pages/ShopCart"
// import Trade from "@/pages/Trade"
// import Pay from "@/pages/Pay"
// import PaySuccess from "@/pages/PaySuccess"
// import Center from "@/pages/Center"
// //引入二级路由组件
// import MyOrder from "@/pages/Center/myOrder"
// import GroupOrder from "@/pages/Center/groupOrder"

let originPush = VueRouter.prototype.push
// 保存VueRouter原型对象的push

// 保存VueRouter原型对象的replace
let originReplace = VueRouter.prototype.replace

// 重写push方法
VueRouter.prototype.push = function (location, resolve, reject) {
    if (resolve && reject) {
        originPush.call(this, location, resolve, reject)
    } else {
        originPush.call(this, location, () => { }, () => { })
    }
}
//第一个参数location：告诉原来push方法，往哪里跳（传递哪些参数）
//第二个参数resolve：成功回调
//第三个参数reject：失败回调

//重新replace方法
VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        originReplace.call(this, location, resolve, reject)
    } else {
        originReplace.call(this, location, () => { }, () => { })
    }
}




// 配置路由
let router = new VueRouter({
    routes: [{
        path: '/home',
        component: () => import('@/pages/Home'), //路由的懒加载用法
        meta: { show: true }
        // 配置meta属性判断footer组件的显示与隐藏
    },
    {
        path: '/paysuccess',
        component: () => import('@/pages/PaySuccess'), //路由的懒加载用法
        meta: { show: true },
        // 配置meta属性判断footer组件的显示与隐藏
    },
    {
        path: '/center',
        component: () => import('@/pages/Center'),  //路由的懒加载用法
        meta: { show: true },
        //二级路由组件
        children: [
            {
                path: 'myorder',
                component: () => import('@/pages/Center/myOrder') //路由的懒加载用法
            },
            {
                path: 'grouporder',
                component: () => import('@/pages/Center/groupOrder') //路由的懒加载用法
            },
            //重定向 进来订单页面直接展示我的订单
            {
                path: '/center',
                redirect: '/center/myorder' //路由的懒加载用法
            }
        ]
    },
    {
        path: '/pay',
        component: () => import('@/pages/Pay'), //路由的懒加载用法
        meta: { show: true },
        // 配置meta属性判断footer组件的显示与隐藏

        //独享路由守卫
        beforeEnter: (to, from, next) => {
            if (from.path == '/trade') {
                next()
            } else {
                next(false)
            }
        }
    },
    {
        path: '/trade',
        component: () => import('@/pages/Trade'), //路由的懒加载用法
        meta: { show: true },
        // 配置meta属性判断footer组件的显示与隐藏
        //独享路由守卫
        beforeEnter: (to, from, next) => {
            //去交易页面。必须是从购物车而来，
            if (from.path == '/shopcart') {
                next()
            } else {
                //其他的组件而来返回当前路由
                next(false)
            }
        }
    },
    {
        path: '/shopcart',
        component: () => import('@/pages/ShopCart'), //路由的懒加载用法
        meta: { show: true }
    },
    {
        path: '/detail/:skuid', //params参数
        component: () => import('@/pages/Detail'), //路由的懒加载用法
        meta: { show: true }
    },
    {
        path: '/addcartsuccess',
        name: 'addcartsuccess',
        component: () => import('@/pages/AddCartSuccess'), //路由的懒加载用法
        meta: { show: true }
    },
    {
        name: 'search',
        path: '/search/:keyword',  //params参数需要占位
        component: () => import('@/pages/Search'), //路由的懒加载用法
        meta: { show: true }
    },
    {
        path: '/login',
        component: () => import('@/pages/Login'), //路由的懒加载用法
        meta: { show: false }
    },
    {
        path: '/register',
        component: () => import('@/pages/Register'), //路由的懒加载用法
        meta: { show: false }
    },
    {
        // 重定向，在项目跑起来的时候，使用户一开始就能看到我们的首页
        path: '*',
        redirect: '/home'
    }],
    //滚动行为   
    scrollBehavior(to, from, savedPosition) {
        return { y: 0 }
        //里面有 x ， y  x为水平方向 y为垂直 值为0代表滚动条再最顶部
    }

})

//全局路由守卫 （前置守卫）
router.beforeEach(async (to, from, next) => {
    // to：可以获取到你要跳转到哪个路由信息
    // from：可以获取到你从哪个路由而来的信息
    // next：放行函数 --- next()放行     next(path)放行到指定的路由    next(false)
    let token = store.state.user.token
    //获取用户的token  唯一标识符
    let name = store.state.user.userInfo.name
    //获取用户的信息 名字
    if (token) {
        if (to.path == '/login') {
            //用户已经登录了，还想去登录页面（休想）
            next('/home')
            //强制让用户去首页
        } else {
            //登录了，但是去的不是login登录页面
            if (name) {
                //用户已经登录，用户名也有放行
                next()
            } else {
                //没有用户信息，派发action让仓库存储数据在跳转
                try {
                    await store.dispatch('getUserInfo')
                    //获取用户信息成功
                    next()
                    //放行
                } catch (error) {
                    //token失效了，获取不用用户信息
                    await store.dispatch('reqLogout')
                    //清除token
                    next('/login')
                    //重新跳转登录页面，重新登陆
                }
            }
        }
    } else {
        //没有登录。没有token
        // if (to.path == '/trade' || to.path == '/pay' || to.path == '/paysuccess' || to.path == '/center/myorder' || to.path == '/center/grouporder')

        //简写判断
        //未登录：不能去交易相关，支付相关，个人中心
        let toPath = to.path
        //如果去了上面这些路由 === 让他回到登录页面
        if (toPath.indexOf('/pay') != -1 || toPath.indexOf('/trade') != -1 || toPath.indexOf('/center') != -1) {
            next('/login?redirect=' + toPath)
        } else {
            //没有去上面这些路由，放行
            next()
        }
        next()
    }
})
export default router